$40 事故後的止血和路由策略,解決了「當下的錯」。但一個月後我差點重蹈覆轍:某天晚上隨手建一個新的提醒 job,手一快,model 欄位又忘了填。
那一刻我想通了一件事:**問題從來不是 AI 不自律,是我不自律。**規則放在腦子裡,就會敗給「今天很累」「只是個小 job」「下次再改」。人靠意志力遵守規範的成功率,工程師應該最清楚——所以我們才發明了 CI、lint、code review。
於是我把散落的教訓整理成一份成文的「法律」:品質閘道(Quality Gate)。任何排程任務,新建或修改,都要過五道閘門。過不了就不准上線。今天講這五道閘門的內容、違規怎麼處理,以及「法律」要寫在哪裡才真的有效。

| # | 閘門 | 規則 | 對應的血淚 |
|---|---|---|---|
| 1 | model 白名單 | 純文字 → Gemini(免費額度);exec 任務 → Claude Haiku;Claude 旗艦一律禁止 | $40 事故(Day 22) |
| 2 | delivery 目標 | 推播必須指向唯一合法的群組 ID | 曾把通知發進測試群,家人看到一堆亂碼報告 |
| 3 | topic 有效值 | topicId 只接受白名單清單內的值 | 殭屍 job 靜默空轉兩週(Day 15) |
| 4 | 時區顯式宣告 | schedule 必須帶 tz——沒寫不會報錯,排程器直接當 UTC | 「早報」下午兩點準時發、記憶整合挑我用電腦的上午跑(Day 9) |
| 5 | fallbacks 必空 | fallback 陣列必須是 [] |
升級鏈印鈔機(Day 22) |
(timeout ≤ 120 秒也在掃描範圍內,它掛在模型規則那份文件下,不佔閘門編號——$40 事故的重試教訓由它看守。)
五道閘門有一個共同特徵:**全部是可機器判定的封閉規則。**不是「模型選擇要合理」這種開放式原則,而是「欄位值必須在這個集合內」。原則靠人詮釋,閘門靠字串比對——後者才擋得住晚上十一點很累的我。
特別說一下第 3、4 道——它們防的是同一族錯誤:靜默失敗。往不存在的 topic 發訊息不會報錯,job 永遠顯示成功;時區沒宣告也不會報錯,排程器安靜地用 UTC 解讀,於是我的「今日能量早報」曾經一個多月都在下午兩點準時送達(Day 9),每一天都「執行成功」。會大聲失敗的錯誤都好辦,閘門真正的價值是攔下那些安靜的。
規則的存放位置比內容更關鍵。我把閘道寫進 Agent 的行為協定檔——那份定義 Agent 核心行為的 Markdown(我的系統裡叫 AGENTS.md),Agent 每次啟動任務都會讀它。
這帶來一個微妙但重要的效果:閘道同時約束人和 AI。
## 品質閘道(新建/修改 Cron Job 必過)
| 欄位 | 規則 |
|------|------|
| model | 文字生成→Gemini;exec→Claude Haiku;Claude 旗艦一律禁止 |
| delivery.to | 必須為 <合法群組 ID> |
| topicId | 只接受白名單:{投資, 備考, 家居, 開發, 生活…對應的 ID} |
| schedule.tz | 必須顯式宣告(沒寫=排程器當 UTC,且不報錯) |
| fallbacks | 必須為 [] |
法律沒有警察就是標語。我的警察是一支每天跑的自我掃描 job:讀出所有排程任務的設定,逐一比對五道閘門,違規就列進報告、發告警。
違規的處理分兩級:
| 等級 | 情形 | 處置 |
|---|---|---|
| 🔴 高風險 | model 用到旗艦、fallbacks 非空 | 告警 + 當天處理(這是錢在漏) |
| 🟡 低風險 | topic 不合法、時區未宣告、timeout 沒設 | 列入報告,週末批次修 |
分級的依據還是那個老標準——後果的價格。model 違規每小時都在燒錢,必須即刻處理;topic 違規頂多是通知去錯地方,可以攢著修。
掃描器本身也有一條誠實條款:如果它讀不到 job 清單(API 掛了、權限問題),必須回報「無法掃描」,而不是回報「全部合規」。這是監控系統的基本倫理——「我不知道」和「沒問題」是兩個完全不同的答案,混淆它們的監控比沒有監控更危險。
**坑一:閘道寫了,舊 job 沒回溯。**立法只管未來,但我有三十幾個「立法前」的存量 job。第一次全量掃描跑下來,違規清單長得讓人臉紅——一半以上的 job 至少踩一條。花了一個週末逐一修完。教訓:新規則上線的第一件事,是拿它掃一遍存量,不然你的法律只保護增量,債都埋在存量裡。
**坑二:把「建議」和「規則」混在同一張表。**初版閘道文件裡混了幾條「盡量」「建議」開頭的軟性條款,結果整份文件的權威性被稀釋——連硬規則都開始被(我自己)通融。後來把文件拆成兩份:閘道只留可機器判定的硬規則,軟性建議移去另一份指南。規則文件裡出現一個「盡量」,整份文件都變成盡量。
品質閘道的核心思想:把教訓變成封閉規則、規則寫進協定檔讓人機共守、再用排程掃描執法。從此「又忘了填 model」這類錯誤,從機率事件變成不可能事件。
閘道管的是「不做錯事」,但系統整體的健康還需要一個更宏觀的答案。明天講我的系統每月一次的期末考:健康評分怎麼設計、85 分 B 級是什麼概念,以及一個「誤報 31 次把警報搞到失效」的慘案。
🔑 這篇的關鍵字
品質閘道 / Quality Gate:把教訓寫成可機器判定的規則,而不是記在腦裡或寫在 wiki
封閉規則 vs 開放原則:「禁止 X」可以自動檢查,「要謹慎」不行
人機共守:規則同時綁在人的流程(PR checklist)與機器的流程(每日掃描)上
⚠️ 掃描腳本本身要反向驗證:塞一個假違規進去,確認它會叫(見 Day 28 的慘案)
我是一名金融業資訊工程師,這是我半年來在家自架 AI Agent 系統的實錄。